package modelo;

import clases.Almacen;
import clases.AlmacenArticulo;
import clases.Articulo;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 * Modelo de Almacen - Articulo
 * @author Edder
 * @version 1.0
 */
public class MdlAlmacenArticulo implements Modelo<AlmacenArticulo>{

    /**
     * Inserta stock y stock mínimo para cada artículo en cada almacén
     * @param objeto AlmacenArticulo sin ID
     * @param cnx Conexión previamente abierta
     * @throws SQLException
     */
    @Override
    public void insert(AlmacenArticulo objeto, Conexion cnx) throws SQLException {
        String sql = "INSERT INTO almacenarticulo(idAlmacen, idArticulo, stock, stockMinimo) VALUES("
                + objeto.getAlmacen().getIdAlmacen() + ", "
                + objeto.getArticulo().getIdArticulo() + ", "
                + objeto.getStock() + ", "
                + objeto.getStockMinimo() + ");";
        cnx.ejecutar(sql);
    }

    /**
     * Obtiene el último ID insertado
     * @param cnx Conexión previamente abierta
     * @return Último ID
     * @throws SQLException
     */
    @Override
    public int getLastId(Conexion cnx) throws SQLException {
        String sql = "SELECT MAX(idAlmacenArticulo) FROM almacenarticulo";
        ResultSet rs = cnx.consultar(sql);
        if(rs.next())
            return rs.getInt(1);
        return -1;
    }

    /**
     * Asigna stock y stock mínimo
     * @param objeto Almacen articulo (con ID)
     * @param cnx Conexión previamente abierta
     * @throws SQLException
     */
    @Override
    public void update(AlmacenArticulo objeto, Conexion cnx) throws SQLException {
        String sql = "UPDATE almacenarticulo SET "
                + "stock = " + objeto.getStock() + ", "
                + "stockMinimo = " + objeto.getStockMinimo() + " "
                + "WHERE idAlmacenArticulo = " + objeto.getIdAlmacenArticulo();
        cnx.ejecutar(sql);
    }
    
    /**
     * Asigna stock
     * @param idAlmacenArticulo
     * @param variacion
     * @param cnx Conexión previamente abierta
     * @throws SQLException
     */
    public void updateStock(int idAlmacenArticulo, int variacion, Conexion cnx) throws SQLException {
        String sql = "UPDATE almacenarticulo SET "
                + "stock = stock + " + variacion + " "
                + "WHERE idAlmacenArticulo = " + idAlmacenArticulo;
        cnx.ejecutar(sql);
    }
    
    public ArrayList<AlmacenArticulo> getAlmacenArticulos_articulo(int idArticulo, Conexion cnx) throws SQLException{
        String sql = "SELECT * "
                + "FROM almacenarticulo "
                + "WHERE idArticulo = " + idArticulo;
        System.out.println(sql);
        return get(sql, cnx);
    }
    
    /**
     * 
     * @param idAlmacen
     * @param cnx
     * @return
     * @throws SQLException 
     */
    public ArrayList<AlmacenArticulo> getAlmacenArticulos_almacen(int idAlmacen, Conexion cnx) throws SQLException{
        String sql = "SELECT * "
                + "FROM almacenarticulo "
                + "WHERE idAlmacen = " + idAlmacen;
        
        return get(sql, cnx);
    }

    /**
     * Retorna lista de AlmacenArticulos
     * @param sql
     * @param cnx
     * @return
     * @throws SQLException
     */
    @Override
    public ArrayList<AlmacenArticulo> get(String sql, Conexion cnx) throws SQLException {
        ArrayList<AlmacenArticulo> almacenArticulos = new ArrayList<>();
        ResultSet rs = cnx.consultar(sql);
        while(rs.next()){
            almacenArticulos.add(new AlmacenArticulo(
                    rs.getInt("idAlmacenArticulo"),
                    new Almacen(){{this.setIdAlmacen(rs.getInt("idAlmacen"));}},
                    new Articulo(){{this.setIdArticulo(rs.getInt("idArticulo"));}},
                    rs.getInt("stock"), 
                    rs.getInt("stockMinimo")));
        }
        return almacenArticulos;
    }

    @Override
    public AlmacenArticulo get(int id, Conexion cnx) throws SQLException {
        String sql = "SELECT * FROM almacenarticulo WHERE idAlmacenArticulo = " + id;
        ResultSet rs = cnx.consultar(sql);
        if(rs.next())
            return new AlmacenArticulo(
                    rs.getInt("idAlmacenArticulo"),
                    new Almacen(){{this.setIdAlmacen(rs.getInt("idAlmacen"));}},
                    new Articulo(){{this.setIdArticulo(rs.getInt("idArticulo"));}}, 
                    rs.getInt("stock"),
                    rs.getInt("stockMinimo"));
        return null;
    }
    
    public int getId(int idAlmacen, int idArticulo, Conexion cnx) throws SQLException{
        String sql = "SELECT idAlmacenArticulo FROM almacenarticulo "
                + "WHERE idAlmacen = " + idAlmacen + " AND "
                + "idArticulo = " + idArticulo + ";";
        ResultSet rs = cnx.consultar(sql);
        if(rs.next())
            return rs.getInt("idAlmacenArticulo");
        return -1;
    }
    
}
